--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sbapp/pmqtt/properties.py 2.0.0 (cf698d96) Text, 17.37 KB
T8b949e# *******************************************************************
T8b949e# Copyright (c) 2017, 2019 IBM Corp.
T8b949e#
T8b949e# All rights reserved. This program and the accompanying materials
T8b949e# are made available under the terms of the Eclipse Public License v2.0
T8b949e# and Eclipse Distribution License v1.0 which accompany this distribution.
T8b949e#
T8b949e# The Eclipse Public License is available at
T8b949e# http://www.eclipse.org/legal/epl-v20.html
T8b949e# and the Eclipse Distribution License is available at
T8b949e# http://www.eclipse.org/org/documents/edl-v10.php.
T8b949e#
T8b949e# Contributors:
T8b949e# Ian Craggs - initial implementation and/or documentation
T8b949e# *******************************************************************
Tff7b72import T7ee787struct
Tff7b72from T7ee787.T7ee787packettypes Tff7b72import Te6edf3PacketTypes
Tff7b72class T56d364MQTTExceptionTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72class T56d364MalformedPacketTb4b4b4(Te6edf3MQTTExceptionTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72def Td2a8ffwriteInt16Tb4b4b4(Te6edf3lengthTb4b4b4)Tb4b4b4:
T8b949e# serialize a 16 bit integer to network format
Tff7b72return Tffa657bytearrayTb4b4b4(Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!HTa5d6ff"Tb4b4b4, Te6edf3lengthTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffreadInt16Tb4b4b4(Te6edf3bufTb4b4b4)Tb4b4b4:
T8b949e# deserialize a 16 bit integer from network format
Tff7b72return Te6edf3structTff7b72.Td2a8ffunpackTb4b4b4(Ta5d6ff"Ta5d6ff!HTa5d6ff"Tb4b4b4, Te6edf3bufTb4b4b4[Tb4b4b4:T79c0ff2Tb4b4b4]Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72def Td2a8ffwriteInt32Tb4b4b4(Te6edf3lengthTb4b4b4)Tb4b4b4:
T8b949e# serialize a 32 bit integer to network format
Tff7b72return Tffa657bytearrayTb4b4b4(Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!LTa5d6ff"Tb4b4b4, Te6edf3lengthTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffreadInt32Tb4b4b4(Te6edf3bufTb4b4b4)Tb4b4b4:
T8b949e# deserialize a 32 bit integer from network format
Tff7b72return Te6edf3structTff7b72.Td2a8ffunpackTb4b4b4(Ta5d6ff"Ta5d6ff!LTa5d6ff"Tb4b4b4, Te6edf3bufTb4b4b4[Tb4b4b4:T79c0ff4Tb4b4b4]Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72def Td2a8ffwriteUTFTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
T8b949e# data could be a string, or bytes. If string, encode into bytes with utf-8
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Tffa657bytesTb4b4b4(Te6edf3dataTb4b4b4, Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3writeInt16Tb4b4b4(Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4) Tff7b72+ Te6edf3data
Tff7b72def Td2a8ffreadUTFTb4b4b4(Te6edf3bufferTb4b4b4, Te6edf3maxlenTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3maxlen Tff7b72>Tff7b72= T79c0ff2Tb4b4b4:
Te6edf3length Tff7b72= Te6edf3readInt16Tb4b4b4(Te6edf3bufferTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Te6edf3MalformedPacketTb4b4b4(Ta5d6ff"Ta5d6ffNot enough data to read string lengthTa5d6ff"Tb4b4b4)
Te6edf3maxlen Tff7b72-Tff7b72= T79c0ff2
Tff7b72if Te6edf3length Tff7b72> Te6edf3maxlenTb4b4b4:
Tff7b72raise Te6edf3MalformedPacketTb4b4b4(Ta5d6ff"Ta5d6ffLength delimited string too longTa5d6ff"Tb4b4b4)
Te6edf3buf Tff7b72= Te6edf3bufferTb4b4b4[T79c0ff2Tb4b4b4:T79c0ff2Tff7b72+Te6edf3lengthTb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
T8b949e# look for chars which are invalid for MQTT
Tff7b72for Te6edf3c Tff7b72in Te6edf3bufTb4b4b4: T8b949e# look for D800-DFFF in the UTF string
Te6edf3ord_c Tff7b72= Tffa657ordTb4b4b4(Te6edf3cTb4b4b4)
Tff7b72if Te6edf3ord_c Tff7b72>Tff7b72= T79c0ff0xD800 Tff7b72and Te6edf3ord_c Tff7b72<Tff7b72= T79c0ff0xDFFFTb4b4b4:
Tff7b72raise Te6edf3MalformedPacketTb4b4b4(Ta5d6ff"Ta5d6ff[MQTT-1.5.4-1] D800-DFFF found in UTF-8 dataTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3ord_c Tff7b72== T79c0ff0x00Tb4b4b4: T8b949e# look for null in the UTF string
Tff7b72raise Te6edf3MalformedPacketTb4b4b4(Ta5d6ff"Ta5d6ff[MQTT-1.5.4-2] Null found in UTF-8 dataTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3ord_c Tff7b72== T79c0ff0xFEFFTb4b4b4:
Tff7b72raise Te6edf3MalformedPacketTb4b4b4(Ta5d6ff"Ta5d6ff[MQTT-1.5.4-3] U+FEFF in UTF-8 dataTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3bufTb4b4b4, Te6edf3lengthTff7b72+T79c0ff2
Tff7b72def Td2a8ffwriteBytesTb4b4b4(Te6edf3bufferTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3writeInt16Tb4b4b4(Tffa657lenTb4b4b4(Te6edf3bufferTb4b4b4)Tb4b4b4) Tff7b72+ Te6edf3buffer
Tff7b72def Td2a8ffreadBytesTb4b4b4(Te6edf3bufferTb4b4b4)Tb4b4b4:
Te6edf3length Tff7b72= Te6edf3readInt16Tb4b4b4(Te6edf3bufferTb4b4b4)
Tff7b72return Te6edf3bufferTb4b4b4[T79c0ff2Tb4b4b4:T79c0ff2Tff7b72+Te6edf3lengthTb4b4b4]Tb4b4b4, Te6edf3lengthTff7b72+T79c0ff2
Tff7b72class T56d364VariableByteIntegersTb4b4b4: T8b949e# Variable Byte Integer
T8b949e"""
MQTT variable byte integer helper class. Used
in several places in MQTT v5.0 properties.
"""
Tf0883e@staticmethod
Tff7b72def Td2a8ffencodeTb4b4b4(Te6edf3xTb4b4b4)Tb4b4b4:
T8b949e"""
Convert an integer 0 <= x <= 268435455 into multi-byte format.
Returns the buffer converted from the integer.
"""
Tff7b72if Tff7b72not T79c0ff0 Tff7b72<Tff7b72= Te6edf3x Tff7b72<Tff7b72= T79c0ff268435455Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffValue Tffd700{Te6edf3xTffd700!r}Ta5d6ff must be in range 0-268435455Ta5d6ff"Tb4b4b4)
Te6edf3buffer Tff7b72= Ta5d6ffbTa5d6ff'Ta5d6ff'
Tff7b72while T79c0ff1Tb4b4b4:
Te6edf3digit Tff7b72= Te6edf3x Tff7b72% T79c0ff128
Te6edf3x Tff7b72/Tff7b72/Tff7b72= T79c0ff128
Tff7b72if Te6edf3x Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3digit Tff7b72|Tff7b72= T79c0ff0x80
Te6edf3buffer Tff7b72+Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3digitTb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3x Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72break
Tff7b72return Te6edf3buffer
Tf0883e@staticmethod
Tff7b72def Td2a8ffdecodeTb4b4b4(Te6edf3bufferTb4b4b4)Tb4b4b4:
T8b949e"""
Get the value of a multi-byte integer from a buffer
Return the value, and the number of bytes used.
[MQTT-1.5.5-1] the encoded value MUST use the minimum number of bytes necessary to represent the value
"""
Te6edf3multiplier Tff7b72= T79c0ff1
Te6edf3value Tff7b72= T79c0ff0
Tffa657bytes Tff7b72= T79c0ff0
Tff7b72while T79c0ff1Tb4b4b4:
Tffa657bytes Tff7b72+Tff7b72= T79c0ff1
Te6edf3digit Tff7b72= Te6edf3bufferTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3buffer Tff7b72= Te6edf3bufferTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]
Te6edf3value Tff7b72+Tff7b72= Tb4b4b4(Te6edf3digit Tff7b72& T79c0ff127Tb4b4b4) Tff7b72* Te6edf3multiplier
Tff7b72if Te6edf3digit Tff7b72& T79c0ff128 Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72break
Te6edf3multiplier Tff7b72*Tff7b72= T79c0ff128
Tff7b72return Tb4b4b4(Te6edf3valueTb4b4b4, Tffa657bytesTb4b4b4)
Tff7b72class T56d364PropertiesTb4b4b4:
T8b949e"""MQTT v5.0 properties class.
See Properties.names for a list of accepted property names along with their numeric values.
See Properties.properties for the data type of each property.
Example of use::
publish_properties = Properties(PacketTypes.PUBLISH)
publish_properties.UserProperty = ("a", "2")
publish_properties.UserProperty = ("c", "3")
First the object is created with packet type as argument, no properties will be present at
this point. Then properties are added as attributes, the name of which is the string property
name without the spaces.
"""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3packetTypeTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpacketType Tff7b72= Te6edf3packetType
Tff7b72selfTff7b72.Td2a8fftypes Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffByteTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTwo Byte IntegerTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffFour Byte IntegerTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffVariable Byte IntegerTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffBinary DataTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffUTF-8 Encoded StringTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffUTF-8 String PairTa5d6ff"Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffnames Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffPayload Format IndicatorTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffMessage Expiry IntervalTa5d6ff"Tb4b4b4: T79c0ff2Tb4b4b4,
Ta5d6ff"Ta5d6ffContent TypeTa5d6ff"Tb4b4b4: T79c0ff3Tb4b4b4,
Ta5d6ff"Ta5d6ffResponse TopicTa5d6ff"Tb4b4b4: T79c0ff8Tb4b4b4,
Ta5d6ff"Ta5d6ffCorrelation DataTa5d6ff"Tb4b4b4: T79c0ff9Tb4b4b4,
Ta5d6ff"Ta5d6ffSubscription IdentifierTa5d6ff"Tb4b4b4: T79c0ff11Tb4b4b4,
Ta5d6ff"Ta5d6ffSession Expiry IntervalTa5d6ff"Tb4b4b4: T79c0ff17Tb4b4b4,
Ta5d6ff"Ta5d6ffAssigned Client IdentifierTa5d6ff"Tb4b4b4: T79c0ff18Tb4b4b4,
Ta5d6ff"Ta5d6ffServer Keep AliveTa5d6ff"Tb4b4b4: T79c0ff19Tb4b4b4,
Ta5d6ff"Ta5d6ffAuthentication MethodTa5d6ff"Tb4b4b4: T79c0ff21Tb4b4b4,
Ta5d6ff"Ta5d6ffAuthentication DataTa5d6ff"Tb4b4b4: T79c0ff22Tb4b4b4,
Ta5d6ff"Ta5d6ffRequest Problem InformationTa5d6ff"Tb4b4b4: T79c0ff23Tb4b4b4,
Ta5d6ff"Ta5d6ffWill Delay IntervalTa5d6ff"Tb4b4b4: T79c0ff24Tb4b4b4,
Ta5d6ff"Ta5d6ffRequest Response InformationTa5d6ff"Tb4b4b4: T79c0ff25Tb4b4b4,
Ta5d6ff"Ta5d6ffResponse InformationTa5d6ff"Tb4b4b4: T79c0ff26Tb4b4b4,
Ta5d6ff"Ta5d6ffServer ReferenceTa5d6ff"Tb4b4b4: T79c0ff28Tb4b4b4,
Ta5d6ff"Ta5d6ffReason StringTa5d6ff"Tb4b4b4: T79c0ff31Tb4b4b4,
Ta5d6ff"Ta5d6ffReceive MaximumTa5d6ff"Tb4b4b4: T79c0ff33Tb4b4b4,
Ta5d6ff"Ta5d6ffTopic Alias MaximumTa5d6ff"Tb4b4b4: T79c0ff34Tb4b4b4,
Ta5d6ff"Ta5d6ffTopic AliasTa5d6ff"Tb4b4b4: T79c0ff35Tb4b4b4,
Ta5d6ff"Ta5d6ffMaximum QoSTa5d6ff"Tb4b4b4: T79c0ff36Tb4b4b4,
Ta5d6ff"Ta5d6ffRetain AvailableTa5d6ff"Tb4b4b4: T79c0ff37Tb4b4b4,
Ta5d6ff"Ta5d6ffUser PropertyTa5d6ff"Tb4b4b4: T79c0ff38Tb4b4b4,
Ta5d6ff"Ta5d6ffMaximum Packet SizeTa5d6ff"Tb4b4b4: T79c0ff39Tb4b4b4,
Ta5d6ff"Ta5d6ffWildcard Subscription AvailableTa5d6ff"Tb4b4b4: T79c0ff40Tb4b4b4,
Ta5d6ff"Ta5d6ffSubscription Identifier AvailableTa5d6ff"Tb4b4b4: T79c0ff41Tb4b4b4,
Ta5d6ff"Ta5d6ffShared Subscription AvailableTa5d6ff"Tb4b4b4: T79c0ff42
Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffproperties Tff7b72= Tb4b4b4{
T8b949e# id: type, packets
T8b949e# payload format indicator
T79c0ff1Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffByteTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffPUBLISHTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffWILLMESSAGETb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff2Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffFour Byte IntegerTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffPUBLISHTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffWILLMESSAGETb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff3Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffUTF-8 Encoded StringTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffPUBLISHTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffWILLMESSAGETb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff8Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffUTF-8 Encoded StringTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffPUBLISHTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffWILLMESSAGETb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff9Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffBinary DataTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffPUBLISHTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffWILLMESSAGETb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff11Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffVariable Byte IntegerTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffPUBLISHTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffSUBSCRIBETb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff17Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffFour Byte IntegerTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNECTTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffDISCONNECTTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff18Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffUTF-8 Encoded StringTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff19Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffTwo Byte IntegerTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff21Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffUTF-8 Encoded StringTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNECTTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffAUTHTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff22Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffBinary DataTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNECTTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffAUTHTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff23Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffByteTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNECTTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff24Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffFour Byte IntegerTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffWILLMESSAGETb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff25Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffByteTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNECTTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff26Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffUTF-8 Encoded StringTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff28Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffUTF-8 Encoded StringTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffDISCONNECTTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff31Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffUTF-8 Encoded StringTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffPUBACKTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffPUBRECTb4b4b4,
Te6edf3PacketTypesTff7b72.Td2a8ffPUBRELTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffPUBCOMPTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffSUBACKTb4b4b4,
Te6edf3PacketTypesTff7b72.Td2a8ffUNSUBACKTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffDISCONNECTTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffAUTHTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff33Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffTwo Byte IntegerTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNECTTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff34Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffTwo Byte IntegerTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNECTTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff35Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffTwo Byte IntegerTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffPUBLISHTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff36Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffByteTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff37Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffByteTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff38Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffUTF-8 String PairTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNECTTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4,
Te6edf3PacketTypesTff7b72.Td2a8ffPUBLISHTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffPUBACKTb4b4b4,
Te6edf3PacketTypesTff7b72.Td2a8ffPUBRECTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffPUBRELTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffPUBCOMPTb4b4b4,
Te6edf3PacketTypesTff7b72.Td2a8ffSUBSCRIBETb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffSUBACKTb4b4b4,
Te6edf3PacketTypesTff7b72.Td2a8ffUNSUBSCRIBETb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffUNSUBACKTb4b4b4,
Te6edf3PacketTypesTff7b72.Td2a8ffDISCONNECTTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffAUTHTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffWILLMESSAGETb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff39Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffFour Byte IntegerTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNECTTb4b4b4, Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff40Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffByteTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff41Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffByteTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4]Tb4b4b4)Tb4b4b4,
T79c0ff42Tb4b4b4: Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffByteTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4[Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4]Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffallowsMultipleTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3compressedNameTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffgetIdentFromNameTb4b4b4(Te6edf3compressedNameTb4b4b4) Tff7b72in Tb4b4b4[T79c0ff11Tb4b4b4, T79c0ff38Tb4b4b4]
Tff7b72def Td2a8ffgetIdentFromNameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3compressedNameTb4b4b4)Tb4b4b4:
T8b949e# return the identifier corresponding to the property name
Te6edf3result Tff7b72= Tff7b72-T79c0ff1
Tff7b72for Te6edf3name Tff7b72in Tff7b72selfTff7b72.Td2a8ffnamesTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3compressedName Tff7b72== Te6edf3nameTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff'Ta5d6ff Ta5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Tff7b72selfTff7b72.Td2a8ffnamesTb4b4b4[Te6edf3nameTb4b4b4]
Tff7b72break
Tff7b72return Te6edf3result
Tff7b72def Tff7b72__setattr__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3valueTb4b4b4)Tb4b4b4:
Te6edf3name Tff7b72= Te6edf3nameTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff'Ta5d6ff Ta5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4)
Te6edf3privateVars Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffpacketTypeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftypesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnamesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpropertiesTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3name Tff7b72in Te6edf3privateVarsTb4b4b4:
Tffa657objectTff7b72.Td2a8ff__setattr__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3valueTb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# the name could have spaces in, or not. Remove spaces before assignment
Tff7b72if Te6edf3name Tff7b72not Tff7b72in Tb4b4b4[Te6edf3anameTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff'Ta5d6ff Ta5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4) Tff7b72for Te6edf3aname Tff7b72in Tff7b72selfTff7b72.Td2a8ffnamesTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4]Tb4b4b4:
Tff7b72raise Te6edf3MQTTExceptionTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffProperty name must be one of Tffd700{Tff7b72selfTff7b72.Td2a8ffnamesTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
T8b949e# check that this attribute applies to the packet type
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpacketType Tff7b72not Tff7b72in Tff7b72selfTff7b72.Td2a8ffpropertiesTb4b4b4[Tff7b72selfTff7b72.Td2a8ffgetIdentFromNameTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4:
Tff7b72raise Te6edf3MQTTExceptionTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffProperty Tffd700{Te6edf3nameTffd700}Ta5d6ff does not apply to packet type Tffd700{Te6edf3PacketTypesTff7b72.Td2a8ffNamesTb4b4b4[Tff7b72selfTff7b72.Td2a8ffpacketTypeTb4b4b4]Tffd700}Ta5d6ff"Tb4b4b4)
T8b949e# Check for forbidden values
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3valueTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3name Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffReceiveMaximumTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTopicAliasTa5d6ff"Tb4b4b4] \
Tff7b72and Tb4b4b4(Te6edf3value Tff7b72< T79c0ff1 Tff7b72or Te6edf3value Tff7b72> T79c0ff65535Tb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3MQTTExceptionTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3nameTffd700}Ta5d6ff property value must be in the range 1-65535Ta5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3name Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffTopicAliasMaximumTa5d6ff"Tb4b4b4] \
Tff7b72and Tb4b4b4(Te6edf3value Tff7b72< T79c0ff0 Tff7b72or Te6edf3value Tff7b72> T79c0ff65535Tb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3MQTTExceptionTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3nameTffd700}Ta5d6ff property value must be in the range 0-65535Ta5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3name Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffMaximumPacketSizeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffSubscriptionIdentifierTa5d6ff"Tb4b4b4] \
Tff7b72and Tb4b4b4(Te6edf3value Tff7b72< T79c0ff1 Tff7b72or Te6edf3value Tff7b72> T79c0ff268435455Tb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3MQTTExceptionTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3nameTffd700}Ta5d6ff property value must be in the range 1-268435455Ta5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3name Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffRequestResponseInformationTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffRequestProblemInformationTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffPayloadFormatIndicatorTa5d6ff"Tb4b4b4] \
Tff7b72and Tb4b4b4(Te6edf3value Tff7b72!= T79c0ff0 Tff7b72and Te6edf3value Tff7b72!= T79c0ff1Tb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3MQTTExceptionTb4b4b4(
Ta5d6fffTa5d6ff"Tffd700{Te6edf3nameTffd700}Ta5d6ff property value must be 0 or 1Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffallowsMultipleTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3valueTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Te6edf3value Tff7b72= Tb4b4b4[Te6edf3valueTb4b4b4]
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4:
Te6edf3value Tff7b72= Tffa657objectTff7b72.Td2a8ff__getattribute__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nameTb4b4b4) Tff7b72+ Te6edf3value
Tffa657objectTff7b72.Td2a8ff__setattr__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3valueTb4b4b4)
Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3buffer Tff7b72= Ta5d6ff"Ta5d6ff[Ta5d6ff"
Te6edf3first Tff7b72= Tff7b72True
Tff7b72for Te6edf3name Tff7b72in Tff7b72selfTff7b72.Td2a8ffnamesTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3compressedName Tff7b72= Te6edf3nameTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff'Ta5d6ff Ta5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3compressedNameTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3firstTb4b4b4:
Te6edf3buffer Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff, Ta5d6ff"
Te6edf3buffer Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3compressedNameTffd700}Ta5d6ff : Tffd700{Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3compressedNameTb4b4b4)Tffd700}Ta5d6ff"
Te6edf3first Tff7b72= Tff7b72False
Te6edf3buffer Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff]Ta5d6ff"
Tff7b72return Te6edf3buffer
Tff7b72def Td2a8ffjsonTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3name Tff7b72in Tff7b72selfTff7b72.Td2a8ffnamesTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3compressedName Tff7b72= Te6edf3nameTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff'Ta5d6ff Ta5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3compressedNameTb4b4b4)Tb4b4b4:
Te6edf3val Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3compressedNameTb4b4b4)
Tff7b72if Te6edf3compressedName Tff7b72== Ta5d6ff'Ta5d6ffCorrelationDataTa5d6ff' Tff7b72and Tffa657isinstanceTb4b4b4(Te6edf3valTb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4:
Te6edf3dataTb4b4b4[Te6edf3compressedNameTb4b4b4] Tff7b72= Te6edf3valTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3dataTb4b4b4[Te6edf3compressedNameTb4b4b4] Tff7b72= Te6edf3val
Tff7b72return Te6edf3data
Tff7b72def Td2a8ffisEmptyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3rc Tff7b72= Tff7b72True
Tff7b72for Te6edf3name Tff7b72in Tff7b72selfTff7b72.Td2a8ffnamesTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3compressedName Tff7b72= Te6edf3nameTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff'Ta5d6ff Ta5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3compressedNameTb4b4b4)Tb4b4b4:
Te6edf3rc Tff7b72= Tff7b72False
Tff7b72break
Tff7b72return Te6edf3rc
Tff7b72def Td2a8ffclearTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3name Tff7b72in Tff7b72selfTff7b72.Td2a8ffnamesTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3compressedName Tff7b72= Te6edf3nameTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff'Ta5d6ff Ta5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3compressedNameTb4b4b4)Tb4b4b4:
Tffa657delattrTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3compressedNameTb4b4b4)
Tff7b72def Td2a8ffwritePropertyTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identifierTb4b4b4, Tffa657typeTb4b4b4, Te6edf3valueTb4b4b4)Tb4b4b4:
Te6edf3buffer Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3buffer Tff7b72+Tff7b72= Te6edf3VariableByteIntegersTff7b72.Td2a8ffencodeTb4b4b4(Te6edf3identifierTb4b4b4) T8b949e# identifier
Tff7b72if Tffa657type Tff7b72== Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffByteTa5d6ff"Tb4b4b4)Tb4b4b4: T8b949e# value
Te6edf3buffer Tff7b72+Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3valueTb4b4b4]Tb4b4b4)
Tff7b72elif Tffa657type Tff7b72== Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffTwo Byte IntegerTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3buffer Tff7b72+Tff7b72= Te6edf3writeInt16Tb4b4b4(Te6edf3valueTb4b4b4)
Tff7b72elif Tffa657type Tff7b72== Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffFour Byte IntegerTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3buffer Tff7b72+Tff7b72= Te6edf3writeInt32Tb4b4b4(Te6edf3valueTb4b4b4)
Tff7b72elif Tffa657type Tff7b72== Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffVariable Byte IntegerTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3buffer Tff7b72+Tff7b72= Te6edf3VariableByteIntegersTff7b72.Td2a8ffencodeTb4b4b4(Te6edf3valueTb4b4b4)
Tff7b72elif Tffa657type Tff7b72== Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffBinary DataTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3buffer Tff7b72+Tff7b72= Te6edf3writeBytesTb4b4b4(Te6edf3valueTb4b4b4)
Tff7b72elif Tffa657type Tff7b72== Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffUTF-8 Encoded StringTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3buffer Tff7b72+Tff7b72= Te6edf3writeUTFTb4b4b4(Te6edf3valueTb4b4b4)
Tff7b72elif Tffa657type Tff7b72== Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffUTF-8 String PairTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3buffer Tff7b72+Tff7b72= Te6edf3writeUTFTb4b4b4(Te6edf3valueTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4) Tff7b72+ Te6edf3writeUTFTb4b4b4(Te6edf3valueTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tff7b72return Te6edf3buffer
Tff7b72def Td2a8ffpackTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e# serialize properties into buffer for sending over network
Te6edf3buffer Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72for Te6edf3name Tff7b72in Tff7b72selfTff7b72.Td2a8ffnamesTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3compressedName Tff7b72= Te6edf3nameTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff'Ta5d6ff Ta5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3compressedNameTb4b4b4)Tb4b4b4:
Te6edf3identifier Tff7b72= Tff7b72selfTff7b72.Td2a8ffgetIdentFromNameTb4b4b4(Te6edf3compressedNameTb4b4b4)
Te6edf3attr_type Tff7b72= Tff7b72selfTff7b72.Td2a8ffpropertiesTb4b4b4[Te6edf3identifierTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Tff7b72selfTff7b72.Td2a8ffallowsMultipleTb4b4b4(Te6edf3compressedNameTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3prop Tff7b72in Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3compressedNameTb4b4b4)Tb4b4b4:
Te6edf3buffer Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffwritePropertyTb4b4b4(Te6edf3identifierTb4b4b4,
Te6edf3attr_typeTb4b4b4, Te6edf3propTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3buffer Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffwritePropertyTb4b4b4(Te6edf3identifierTb4b4b4, Te6edf3attr_typeTb4b4b4,
Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3compressedNameTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3VariableByteIntegersTff7b72.Td2a8ffencodeTb4b4b4(Tffa657lenTb4b4b4(Te6edf3bufferTb4b4b4)Tb4b4b4) Tff7b72+ Te6edf3buffer
Tff7b72def Td2a8ffreadPropertyTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bufferTb4b4b4, Tffa657typeTb4b4b4, Te6edf3propslenTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657type Tff7b72== Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffByteTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3value Tff7b72= Te6edf3bufferTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3valuelen Tff7b72= T79c0ff1
Tff7b72elif Tffa657type Tff7b72== Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffTwo Byte IntegerTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3value Tff7b72= Te6edf3readInt16Tb4b4b4(Te6edf3bufferTb4b4b4)
Te6edf3valuelen Tff7b72= T79c0ff2
Tff7b72elif Tffa657type Tff7b72== Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffFour Byte IntegerTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3value Tff7b72= Te6edf3readInt32Tb4b4b4(Te6edf3bufferTb4b4b4)
Te6edf3valuelen Tff7b72= T79c0ff4
Tff7b72elif Tffa657type Tff7b72== Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffVariable Byte IntegerTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3valueTb4b4b4, Te6edf3valuelen Tff7b72= Te6edf3VariableByteIntegersTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3bufferTb4b4b4)
Tff7b72elif Tffa657type Tff7b72== Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffBinary DataTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3valueTb4b4b4, Te6edf3valuelen Tff7b72= Te6edf3readBytesTb4b4b4(Te6edf3bufferTb4b4b4)
Tff7b72elif Tffa657type Tff7b72== Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffUTF-8 Encoded StringTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3valueTb4b4b4, Te6edf3valuelen Tff7b72= Te6edf3readUTFTb4b4b4(Te6edf3bufferTb4b4b4, Te6edf3propslenTb4b4b4)
Tff7b72elif Tffa657type Tff7b72== Tff7b72selfTff7b72.Td2a8fftypesTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ff"Ta5d6ffUTF-8 String PairTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3valueTb4b4b4, Te6edf3valuelen Tff7b72= Te6edf3readUTFTb4b4b4(Te6edf3bufferTb4b4b4, Te6edf3propslenTb4b4b4)
Te6edf3buffer Tff7b72= Te6edf3bufferTb4b4b4[Te6edf3valuelenTb4b4b4:Tb4b4b4] T8b949e# strip the bytes used by the value
Te6edf3value1Tb4b4b4, Te6edf3valuelen1 Tff7b72= Te6edf3readUTFTb4b4b4(Te6edf3bufferTb4b4b4, Te6edf3propslen Tff7b72- Te6edf3valuelenTb4b4b4)
Te6edf3value Tff7b72= Tb4b4b4(Te6edf3valueTb4b4b4, Te6edf3value1Tb4b4b4)
Te6edf3valuelen Tff7b72+Tff7b72= Te6edf3valuelen1
Tff7b72return Te6edf3valueTb4b4b4, Te6edf3valuelen
Tff7b72def Td2a8ffgetNameFromIdentTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identifierTb4b4b4)Tb4b4b4:
Te6edf3rc Tff7b72= Tff7b72None
Tff7b72for Te6edf3name Tff7b72in Tff7b72selfTff7b72.Td2a8ffnamesTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffnamesTb4b4b4[Te6edf3nameTb4b4b4] Tff7b72== Te6edf3identifierTb4b4b4:
Te6edf3rc Tff7b72= Te6edf3name
Tff7b72return Te6edf3rc
Tff7b72def Td2a8ffunpackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bufferTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
T8b949e# deserialize properties into attributes from buffer received from network
Te6edf3propslenTb4b4b4, Te6edf3VBIlen Tff7b72= Te6edf3VariableByteIntegersTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3bufferTb4b4b4)
Te6edf3buffer Tff7b72= Te6edf3bufferTb4b4b4[Te6edf3VBIlenTb4b4b4:Tb4b4b4] T8b949e# strip the bytes used by the VBI
Te6edf3propslenleft Tff7b72= Te6edf3propslen
Tff7b72while Te6edf3propslenleft Tff7b72> T79c0ff0Tb4b4b4: T8b949e# properties length is 0 if there are none
Te6edf3identifierTb4b4b4, Te6edf3VBIlen2 Tff7b72= Te6edf3VariableByteIntegersTff7b72.Td2a8ffdecodeTb4b4b4(
Te6edf3bufferTb4b4b4) T8b949e# property identifier
Te6edf3buffer Tff7b72= Te6edf3bufferTb4b4b4[Te6edf3VBIlen2Tb4b4b4:Tb4b4b4] T8b949e# strip the bytes used by the VBI
Te6edf3propslenleft Tff7b72-Tff7b72= Te6edf3VBIlen2
Te6edf3attr_type Tff7b72= Tff7b72selfTff7b72.Td2a8ffpropertiesTb4b4b4[Te6edf3identifierTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3valueTb4b4b4, Te6edf3valuelen Tff7b72= Tff7b72selfTff7b72.Td2a8ffreadPropertyTb4b4b4(
Te6edf3bufferTb4b4b4, Te6edf3attr_typeTb4b4b4, Te6edf3propslenleftTb4b4b4)
Te6edf3buffer Tff7b72= Te6edf3bufferTb4b4b4[Te6edf3valuelenTb4b4b4:Tb4b4b4] T8b949e# strip the bytes used by the value
Te6edf3propslenleft Tff7b72-Tff7b72= Te6edf3valuelen
Te6edf3propname Tff7b72= Tff7b72selfTff7b72.Td2a8ffgetNameFromIdentTb4b4b4(Te6edf3identifierTb4b4b4)
Te6edf3compressedName Tff7b72= Te6edf3propnameTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff'Ta5d6ff Ta5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffallowsMultipleTb4b4b4(Te6edf3compressedNameTb4b4b4) Tff7b72and Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3compressedNameTb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3MQTTExceptionTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffProperty Ta5d6ff'Tffd700{Tffa657propertyTffd700}Ta5d6ff'Ta5d6ff must not exist more than onceTa5d6ff"Tb4b4b4)
Tffa657setattrTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3propnameTb4b4b4, Te6edf3valueTb4b4b4)
Tff7b72return Tff7b72selfTb4b4b4, Te6edf3propslen Tff7b72+ Te6edf3VBIlen
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────